{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "32645dea",
   "metadata": {},
   "source": [
    "# CMSIS-DSP Python package example"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "adbbe2cc",
   "metadata": {},
   "source": [
    "## Installing and importing the needed packages"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "22230ac8",
   "metadata": {},
   "source": [
    "The following command may take some time to execute : the full cmsisdsp library is built."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e684be27",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: cmsisdsp in c:\\benchresults\\pythonwrappertests\\testenv\\lib\\site-packages (1.2.1)\n",
      "Requirement already satisfied: numpy>=1.19 in c:\\benchresults\\pythonwrappertests\\testenv\\lib\\site-packages (from cmsisdsp) (1.22.2)\n",
      "Requirement already satisfied: jinja2>=3.0 in c:\\benchresults\\pythonwrappertests\\testenv\\lib\\site-packages (from cmsisdsp) (3.0.3)\n",
      "Requirement already satisfied: networkx>=2.5 in c:\\benchresults\\pythonwrappertests\\testenv\\lib\\site-packages (from cmsisdsp) (2.6.3)\n",
      "Requirement already satisfied: sympy>=1.6 in c:\\benchresults\\pythonwrappertests\\testenv\\lib\\site-packages (from cmsisdsp) (1.9)\n",
      "Requirement already satisfied: MarkupSafe>=2.0 in c:\\benchresults\\pythonwrappertests\\testenv\\lib\\site-packages (from jinja2>=3.0->cmsisdsp) (2.1.0)\n",
      "Requirement already satisfied: mpmath>=0.19 in c:\\benchresults\\pythonwrappertests\\testenv\\lib\\site-packages (from sympy>=1.6->cmsisdsp) (1.2.1)\n"
     ]
    }
   ],
   "source": [
    "!pip install cmsisdsp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "19c6b88c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import cmsisdsp as dsp\n",
    "import cmsisdsp.fixedpoint as f"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "13c4c9c5",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from ipywidgets import interact, interactive, fixed, interact_manual,FloatSlider\n",
    "import ipywidgets as widgets"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a5e787dc",
   "metadata": {},
   "source": [
    "## Creating the signal"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b9135875",
   "metadata": {},
   "source": [
    "### Conversion functions to use CMSIS-DSP FFTs with complex numbers"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0c645caa",
   "metadata": {},
   "source": [
    "CMSIS-DSP FFTs are processing  array of complex numbers which are represented in memory asan array of floats. There is no specific data types for complex numbers.\n",
    "The Python array is containing complex numbers. They need to be replaced by a sequence of real numbers.\n",
    "The two functions below are doing those conversions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "79d91f10",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Array of complex numbers as an array of real numbers\n",
    "def imToReal1D(a):\n",
    "    ar=np.zeros(np.array(a.shape) * 2)\n",
    "    ar[0::2]=a.real\n",
    "    ar[1::2]=a.imag\n",
    "    return(ar)\n",
    "\n",
    "# Array of real numbers as an array of complex numbers\n",
    "def realToIm1D(ar):\n",
    "    return(ar[0::2] + 1j * ar[1::2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "57740f0a",
   "metadata": {},
   "outputs": [],
   "source": [
    "nb = 512\n",
    "signal = None"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a703fc4c",
   "metadata": {},
   "source": [
    "You can play with the slider to change the frequency of the signal.\n",
    "Don't forget to reconvert the signal to a Q15 format if you want to test the Q15 FFT."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "51cf9d5c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "6623baf5822e42bd8fe58dfc2b417dd7",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(FloatSlider(value=100.0, continuous_update=False, description='f', max=150.0, min=10.0, …"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "@interact(f=FloatSlider(100,min=10,max=150,step=20,continuous_update=False))\n",
    "def gen_signal(f=100):\n",
    "    global signal\n",
    "    global nb\n",
    "    signal = np.sin(2 * np.pi * np.arange(nb)*f / nb) + 0.1*np.random.randn(nb)\n",
    "    plt.plot(signal)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8a959962",
   "metadata": {},
   "source": [
    "## Using the F32 CMSIS-DSP FFT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d5689ee9",
   "metadata": {},
   "source": [
    "The `arm_cfft_instance_f32` is created and initialized."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "54ecc9ae",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n"
     ]
    }
   ],
   "source": [
    "# CMSIS-DSP FFT F32 initialization\n",
    "cfftf32=dsp.arm_cfft_instance_f32()\n",
    "status=dsp.arm_cfft_init_f32(cfftf32,nb)\n",
    "print(status)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "14d1ed0a",
   "metadata": {},
   "source": [
    "The log magnitude of the FFT is computed and siplayed."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "5a8d4c77",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Re-evaluate this each time you change the signal\n",
    "signalR = imToReal1D(signal)\n",
    "resultR = dsp.arm_cfft_f32(cfftf32,signalR,0,1)\n",
    "resultI = realToIm1D(resultR)\n",
    "mag=20 * np.log10(np.abs(resultI))\n",
    "\n",
    "plt.plot(mag[1:nb//2])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "42eb3a5e",
   "metadata": {},
   "source": [
    "## Using the Q15 CMSIS-DSP FFT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4b757402",
   "metadata": {},
   "source": [
    "The signal must be converted to Q15 each time it is changed with the slider above."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "c2a9e191",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Convert the signal to Q15 and viewed as a real array\n",
    "signalR = imToReal1D(signal)\n",
    "signalRQ15 = f.toQ15(signalR)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2652245c",
   "metadata": {},
   "source": [
    "The `arm_cfft_instance_q15` is created and initialized"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "8943c69c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n"
     ]
    }
   ],
   "source": [
    "# Initialize the Q15 CFFT\n",
    "cfftq15 = dsp.arm_cfft_instance_q15()\n",
    "status = dsp.arm_cfft_init_q15(cfftq15,nb)\n",
    "print(status)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "21e39fca",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Compute the Q15 CFFT and convert back to float and complex array\n",
    "resultR = dsp.arm_cfft_q15(cfftq15,signalRQ15,0,1)\n",
    "resultR = f.Q15toF32(resultR)\n",
    "resultI = realToIm1D(resultR)*nb\n",
    "\n",
    "mag = 20 * np.log10(np.abs(resultI))\n",
    "plt.plot(mag[1:nb//2])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1aac0ecd",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
